<?php
/**
 * @name SBShop
 * @author Mukharev Maxim
 * @version 0.1a
 *
 * @desription
 *
 * Электронный магазин для MODx
 *
 * Экшен сниппета электронного магазина: Оформление заказа
 *
 */

class checkout_mode {

	protected $aTemplates; // набор шаблонов
	protected $sEvent; // Заданное действие
	protected $aError; // Информация об ошибке
	protected $sError; // Информация об ошибке

	/**
	 * Конструктор
	 */
	public function  __construct() {
		global $modx;
		/**
		 * Массив шаблонов
		 */
		$this->aTemplates = array();
		/**
		 * Инициализируем информацию об ошибках
		 */
		$this->aError = array();
		/**
		 * Если текущее действие задано
		 */
		if($modx->sbshop->getEvent(1)) {
			/**
			 * Записываем его
			 */
			$this->sEvent = $modx->sbshop->getEvent(1);
		} else {
			/**
			 * Ставим по умолчанию "cart"
			 */
			$this->sEvent = 'cart';
		}
		/**
		 * Устанавливаем набор шаблонов
		 */
		$this->setTemplates();
		/**
		 * Распределяем вызов конкретных методов в зависимости от действия
		 */
		switch ($this->sEvent) {
			case 'cart':
				/**
				 * Если послан переход на следующий шаг
				 */
				if(isset($_POST['sb_order_next'])) {
                                    $userid = $modx->getLoginUserID();

                                    if (!empty($userid)){
					$sRedirect = $modx->sbshop->sBaseUrl . 'checkout/register' . $modx->sbshop->config['url_suffix'];
                                    }else{
					$sRedirect = $modx->sbshop->sBaseUrl . 'checkout/select_type' . $modx->sbshop->config['url_suffix'];
                                    }
                                    $modx->sendRedirect($sRedirect);
				}
				/**
				 * Если была нажата кнопка обновить
				 */
				if(isset($_POST['sb_cart_update'])) {
					$this->updateCart();
				}
				/**
				 * Если нажата кнопка "очистить корзину"
				 */
				if(isset($_POST['sb_order_clear'])) {
					$this->clearCart();
				}
				/**
				 * Вывод информации в корзине
				 */
				$this->cartCheckout();
			break;

                        case 'select_type':
                            $this->select_type();
                            break;

			case 'register':
				/**
				 * Если нажата кнопка далее
				 */
				if(isset($_POST['sb_customer_submit'])) {
					$this->saveRegisterCheckout();
				}
				/**
				 * Вывод информации в регистрации пользователя
				 */
				$this->registerCheckout();
			break;
			case 'ok':
				/**
				 * Выводим завершающую страницу
				 */
				$this->okCheckout();
			break;
		}
	}

	/**
	 * Устанавливаем набор шаблонов
	 */
	public function setTemplates() {
		global $modx;
		/**
		 * Загружаем стандартный файл с шаблонами
		 */
		$sTemplate = $modx->sbshop->getSnippetTemplate('checkout_' . $this->sEvent);
		/**
		 * Разделяем обработку в зависимости от действия
		 */
		switch ($this->sEvent) {
			case 'cart':
				/**
				 * Разбиваем стандартный набор шаблонов
				 */
				list($sEmpty,$sFilled,$sRow,$sOptOuter,$sOptRow,$sOptSeparator) = explode('<!-- ### -->',$sTemplate);
				/**
				 * Устанавливаем шаблоны
				 */
				$this->aTemplates['cart_empty'] = $sEmpty;
				$this->aTemplates['cart_filled'] = $sFilled;
				$this->aTemplates['cart_row'] = $sRow;
				$this->aTemplates['option_outer'] = $sOptOuter;
				$this->aTemplates['option_row'] = $sOptRow;
				$this->aTemplates['option_separator'] = $sOptSeparator;
			break;
                        case 'select_type':
                            list($select_type,$error) =  explode('<!-- ### -->',$sTemplate);
                            $this->aTemplates['select_type'] = $select_type;
                            $this->aTemplates['error'] = $error;
                        break;
			case 'register':
				list($sForm,$sErrorOuter,$sErrorRow) = explode('<!-- ### -->',$sTemplate);
				$this->aTemplates['register_form'] = $sForm;
				$this->aTemplates['error_outer'] = $sErrorOuter;
				$this->aTemplates['error_row'] = $sErrorRow;
			break;
			case 'ok':
				$this->aTemplates['register_ok'] = $sTemplate;
			break;
		}
	}

	/**
	 * Обновление данных корзины
	 */
	public function updateCart() {
		global $modx;
		/**
		 * Требуется ли сохранение
		 */
		$bSave = false;
		/**
		 * Если выбраны товары на удаление
		 */
		if(isset($_POST['sb_order_remove'])) {
			/**
			 * Удаляем выбранные товары
			 */
			$modx->sbshop->oOrder->deleteProducts($_POST['sb_order_remove']);
			/**
			 * Флаг сохранения
			 */
			$bSave = true;
		}
		/**
		 * Обрабатываем изменения количества товара
		 */
		if(isset($_POST['sb_product_quantity'])) {
			/**
			 * Обрабатываем каждое значение
			 */
			foreach ($_POST['sb_product_quantity'] as $sKey => $sVal) {
				/**
				 * Устанавливаем новое значение
				 */
				$modx->sbshop->oOrder->setProduct($sKey, array('quantity' => intval($sVal)));
			}
			/**
			 * Флаг сохранения
			 */
			$bSave = true;
		}
		/**
		 * Если требуется сохранение
		 */
		if($bSave) {
			/**
			 * Сохраняем информацию
			 */
			$modx->sbshop->oOrder->save();
		}
	}

	/**
	 * Очистка корзины
	 */
	public function clearCart() {
		global $modx;
		/**
		 * Делаем очистку корзины
		 */
		$modx->sbshop->oOrder->clear();
	}

	/**
	 * Вывод полной корзины с заказанным товаром
	 */
	public function cartCheckout() {
		global $modx;
		/**
		 * Заголовок
		 */
		$modx->setPlaceholder('sb.longtitle',$modx->sbshop->lang['checkout_cart_title']);
		/**
		 * Инициализируем переменную для вывода результата
		 */
		$sOutput = '';
		/**
		 * Если нет товаров в корзине
		 */
		$aIds = $modx->sbshop->oOrder->getProductSetIds();
		if(count($aIds) == 0) {
			/**
			 * Выводим шаблон пустой корзины
			 */
			$sOutput = $this->aTemplates['cart_empty'];
		} else {
			/**
			 * Инициализируем массив товаров в корзине
			 */
			$aRows = array();
			/**
			 * Обрабатываем товары
			 */
			foreach ($aIds as $iSetId) {
				/**
				 * Получаем товар из списка заказа
				 */
				$oProduct = $modx->sbshop->oOrder->getProduct($iSetId);
				/**
				 * Получаем параметры товара
				 */
				$aProduct = $oProduct->getAttributes();
				/**
				 * Плесхолдеры параметров товара
				 */
				$aRepl = $modx->sbshop->arrayToPlaceholders($aProduct);
				/**
				 * Получаем информацию о количестве и прочих условиях заказа товара
				 */
				$aOrderInfo = $modx->sbshop->oOrder->getOrderSetInfo($iSetId);
				/**
				 * Добавляем плейсхолдеры информации заказа
				 */
				$aRepl = array_merge($aRepl,$modx->sbshop->arrayToPlaceholders($aOrderInfo));
				/**
				 * Делаем рассчет цены товара
				 */
				$aRepl['[+sb.price+]'] = $modx->sbshop->oOrder->getProductPriceBySetId($iSetId);
				/**
				 * Идентификатор набора товара
				 */
				$aRepl['[+sb.set_id+]'] = $iSetId;
				/**
				 * Если установлены опции в товаре
				 */
				$aOptions = array();
				if(isset($aOrderInfo['sboptions']) and count($aOrderInfo['sboptions']) > 0) {
					foreach ($aOrderInfo['sboptions'] as $sOptKeyId => $sOptValId) {
						/**
						 * Создаем плейсхолдеры для значений
						 */
						$aOptRepl = $modx->sbshop->arrayToPlaceholders($oProduct->getNamesByNameIdAndValId($sOptKeyId,$sOptValId));
						/**
						 * Разделитель между опцией и значением
						 */
						$aOptRepl['[+sb.separator+]'] = $modx->sbshop->config['option_separator'];
						/**
						 * Если значение находится в списке скрываемых
						 */
						if(in_array($sOptValId, $modx->sbshop->config['hide_option_values'])) {
							/**
							 * Очищаем разделитель и значение
							 */
							$aOptRepl['[+sb.value+]'] = '';
							$aOptRepl['[+sb.separator+]'] = '';
						}
						$aOptions[] = str_replace(array_keys($aOptRepl), array_values($aOptRepl), $this->aTemplates['option_row']);
					}
					/**
					 * Объединяем ряды и вставляем в контейнер
					 */
					$sOptions = str_replace('[+sb.wrapper+]', implode($this->aTemplates['option_separator'],$aOptions), $this->aTemplates['option_outer']);
					$aRepl['[+sb.options+]'] = $sOptions;
				} else {
					$aRepl['[+sb.options+]'] = '';
				}

                                if(isset($aOrderInfo['sbvariants'])){
                                    $var = new SBVariant($aOrderInfo['sbvariants']);
                                    $aRepl['[+sb.variant+]'] = "Вариант: [$var->article] $var->name";
                                }
				/**
				 * Вставляем данные в шаблон
				 */
				$aRows[] = str_replace(array_keys($aRepl), array_values($aRepl), $this->aTemplates['cart_row']);
			}
			/**
			 * Подготавливаем плейсхолдеры для общего контейнера корзины
			 */
			$aRepl = $modx->sbshop->arrayToPlaceholders($modx->sbshop->oOrder->getAttributes());
			/**
			 * Добавляем ссылку для текущего режима
			 */
			$aRepl['[+sb.link_mode+]'] = $modx->sbshop->sBaseUrl;
			/**
			 * Информация о суффиксе в ссылке
			 */
			$aRepl['[+sb.link_suffix+]'] = $modx->sbshop->config['url_suffix'];
			/**
			 * Следующий шаг - оформление
			 */
			$aRepl['[+sb.link_userform+]'] = $modx->sbshop->sBaseUrl . 'checkout/userinfo' . $modx->sbshop->config['url_suffix'];
			/**
			 * Добавляем сформированные данные
			 */
			$aRepl['[+sb.wrapper+]'] = implode($aRows);
			/**
			 * Вставляем список товаров в контейнер корзины
			 */
			$sOutput = str_replace(array_keys($aRepl), array_values($aRepl), $this->aTemplates['cart_filled']);
		}
		echo $sOutput;
	}

	/**
	 * Получение регистрационной информации от пользователя
	 */
	public function registerCheckout() {
		global $modx;
		/**
		 * Заголовок
		 */
		$modx->setPlaceholder('sb.longtitle',$modx->sbshop->lang['checkout_register_title']);
		/**
		 * Инициализируем переменную для вывода результата
		 */
		$sOutput = '';
		/**
		 * Готовим набор данных пользователя
		 */
                $userid = $modx->getLoginUserID();

                if (!empty($userid)){
                    $modx->sbshop->oCustomer->setAttributes("internalKey",$userid);
                    if (empty($_POST)) {
                        $modx->sbshop->oCustomer->loadByInternalKey($userid);
                    }
                }

		$aCustomer = $modx->sbshop->oCustomer->getAttributes();
		/**
		 * Добавляем шаблон для вывода
		 */
		$sOutput = $this->aTemplates['register_form'];
		/**
		 * Подготавливаем языковые данные
		 */
		$aLang = $modx->sbshop->arrayToPlaceholders($modx->sbshop->lang,'lang.');
		/**
		 * Готовим набор плесхолдеров
		 */
		$aRepl = $modx->sbshop->arrayToPlaceholders($aCustomer);
		/**
		 * Объединяем плейсхолдеры с информацией о клиенте и языковой информацией
		 */
		$aRepl = array_merge($aRepl,$aLang);
		/**
		 * Если есть информация об ошибках
		 */
		if(count($this->aError) > 0) {
			/**
			 * Обрабатываем каждую ошибку
			 */
			$sErrorRows = '';
			foreach ($this->aError as $sErrKey => $sErrVal) {
				/**
				 * Добавляем класс ошибки
				 */
				$aRepl['[+error_' . $sErrKey . '+]'] = 'error';
				/**
				 * Добавляем информацию об ошибке в шаблон
				 */
				$sErrorRows .= str_replace('[+sb.row+]', $sErrVal, $this->aTemplates['error_row']);
			}
			/**
			 * Добавляем информацию в контейнер
			 */
			$aRepl['[+sb.error+]'] = str_replace('[+sb.wrapper+]', $sErrorRows, $this->aTemplates['error_outer']);
		}
		/**
		 * Комментарий
		 */
		$aRepl['[+sb.comment+]'] = $modx->sbshop->oOrder->getFirstComment();

                /*
                 * Web Пользоатель 
                 */

                $aRepl['[+sb.internalKey+]'] = $userid;

                if (!empty($userid)){
                    //tonatos +++ добавить выдергивание полей зарегистрированного пользователя
                    $userdata = $modx->getWebUserInfo($userid);
                    $aRepl['[+sb.email+]'] = $userdata['email'];
                    $aRepl['[+sb.username+]']=  $userdata['username'];
                }else{
                    $aRepl['[+sb.username+]']=  "Не зарегестрирован";

                }

		/**
		 * Делаем замену
		 */
		$sOutput = str_replace(array_keys($aRepl), array_values($aRepl), $sOutput);

		echo $sOutput;
	}

	public function saveRegisterCheckout() {
		global $modx;
		/**
		 * Флаг для определения ошибки
		 */

		$bError = false;
		/**
		 * Проверяем ФИО
		 */
		if(!$_POST['sb_customer_fullname']) {
			$this->aError['sb_customer_fullname'] = $modx->sbshop->lang['customer_error_fullname'];
			$bError = true;
		} else {
			/**
			 * Устанавливаем параметр имени
			 */
			$modx->sbshop->oCustomer->setAttribute('fullname',$modx->db->escape($_POST['sb_customer_fullname']));
		}
		/**
		 * Проверяем телефон
		 */
		if(!$_POST['sb_customer_phone']) {
			$this->aError['sb_customer_phone'] = $modx->sbshop->lang['customer_error_phone'];
			$bError = true;
		} else {
			/**
			 * Устанавливаем параметр имени
			 */
			$modx->sbshop->oCustomer->setAttribute('phone',$modx->db->escape($_POST['sb_customer_phone']));
		}
		/**
		 * Проверяем телефон
		 */
		if($_POST['sb_customer_email'] and !$modx->sbshop->check('email',$_POST['sb_customer_email'])) {
			$this->aError['sb_customer_email'] = $modx->sbshop->lang['customer_error_email'];
			$bError = true;
		} else {
			/**
			 * Устанавливаем параметр имени
			 */
			$modx->sbshop->oCustomer->setAttribute('email',$modx->db->escape($_POST['sb_customer_email']));
		}
		/**
		 * Проверяем телефон
		 */
		if(!$_POST['sb_customer_city']) {
			$this->aError['sb_customer_city'] = $modx->sbshop->lang['customer_error_city'];
			$bError = true;
		} else {
			/**
			 * Устанавливаем параметр имени
			 */
			$modx->sbshop->oCustomer->setAttribute('city',$modx->db->escape($_POST['sb_customer_city']));
		}
		/**
		 * Проверяем телефон
		 */
		if(!$_POST['sb_customer_address']) {
			$this->aError['sb_customer_address'] = $modx->sbshop->lang['customer_error_address'];
			$bError = true;
		} else {
			/**
			 * Устанавливаем параметр имени
			 */
			$modx->sbshop->oCustomer->setAttribute('address',$modx->db->escape($_POST['sb_customer_address']));
		}
                /**
                 * Устанавливаем параметр web пользователя
                 */
                if(!empty($_POST['sb_customer_internalKey'])) {
			$modx->sbshop->oCustomer->setAttribute('internalKey',(int)$_POST['sb_customer_internalKey']);
		}


		/**
		 * Проверяем комментарий
		 */
		if($_POST['sb_order_comment']) {
			$modx->sbshop->oOrder->addComment($modx->db->escape($_POST['sb_order_comment']));
		}
		/**
		 * Если ошибок не обнаружено
		 */
		if(!$bError) {
			/**
			 * Сохраняем информацию клиента
			 */


			$modx->sbshop->oCustomer->save();
			/**
			 * Устанавливаем идентификатор клиента в заказе
			 */
			$modx->sbshop->oOrder->setAttribute('user',$modx->sbshop->oCustomer->getAttribute('id'));
			/**
			 * Устанавливаем статус заказа
			 */
			$modx->sbshop->oOrder->setAttribute('status','10');
			/**
			 * Сохраняем информацию о заказе
			 */
                        

                        /*
                         * Статусы товаров
                         */

                        $aPList = $modx->sbshop->oOrder->getProductIds();
                        $product_status = array();
                        foreach($aPList as $ap){
                            $product_status[$ap]=0;
                        }

                        $modx->sbshop->oOrder->setAttribute('product_status',json_encode($product_status));

			$modx->sbshop->oOrder->save();
			/**
			 * Формируем письмо
			 */
			$sTemplate = $modx->sbshop->getSnippetTemplate('checkout_notice');
			/**
			 * Набор плейсхолдеров
			 */
			$aRepl = $modx->sbshop->arrayToPlaceholders($modx->sbshop->oOrder->getAttributes());
			/**
			 * Данные заказчика
			 */
			$aRepl = array_merge($aRepl,$modx->sbshop->arrayToPlaceholders($modx->sbshop->oCustomer->getAttributes()));
			/**
			 * Сообщение
			 */
			$sMessage = str_replace(array_keys($aRepl), array_values($aRepl), $sTemplate);
			/**
			 * Подключаем класс почты
			 */
			include_once MODX_BASE_PATH . "manager/includes/controls/class.phpmailer.php";
			/**
			 * Настраиваем отправку
			 */
			$mail = new PHPMailer();
			$mail->IsMail();
			$mail->CharSet = $modx->config['modx_charset'];
			$mail->IsHTML(true);
			$mail->From = $modx->config['emailsender'];
			$mail->FromName	= $modx->config['site_name'];
			$mail->Subject = $modx->sbshop->lang['notice_subject'];
			$mail->Body = $sMessage;
			$mail->AddAddress($modx->sbshop->config['notice_email']);
			/**
			 * Отправляем письмо
			 */
			$mail->send();
			/**
			 * Очищаем заказ
			 */
			$modx->sbshop->oOrder->reset();
			/**
			 * Редирект на следующий шаг
			 */
			$sUrl = $modx->sbshop->sBaseUrl . 'checkout/ok' . $modx->sbshop->config['url_suffix'];
			header('Location: ' . $sUrl);
		}
	}

	/**
	 * Завершение оформления заказа
	 */
	public function okCheckout() {
		global $modx;
		/**
		 * Заголовок
		 */
		$modx->setPlaceholder('sb.longtitle',$modx->sbshop->lang['checkout_cart_title']);
		/**
		 * Инициализируем переменную для вывода результата
		 */
		$sOutput = '';
		/**
		 * Добавляем информацию из шаблона
		 */
		$sOutput = $this->aTemplates['register_ok'];
		/**
		 * Выводим
		 */
		echo $sOutput;
	}

        //tonatos писалось все на скорую руку, за красивость кода не ручаюсь (
        function select_type(){
            global $modx;
            $output = $this->aTemplates['select_type'];

            if (isset($_POST)){
                $post = (object)$_POST;
                $errors = array();
                //через регистрацию
                if ($post->by_register){
                    $email = trim($post->email);

                    if (empty($email) || !preg_match("/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$/i", $email)){
                        $errors['error_by_register'] = str_replace("[+error+]","Введите правильный email адрес",$this->aTemplates['error']);
                    }else{
                        $email=$modx->db->escape($email);
                        // check for duplicate email address
                        $rs = $modx->db->query("SELECT internalKey FROM ".$modx->getFullTableName("web_user_attributes")." WHERE lower(email)=lower('$email')");
                        $limit = $modx->db->getRecordCount($rs);
                        if($limit>0) {
                            $errors['error_by_register'] = str_replace("[+error+]","Данный email адрес уже используется",$this->aTemplates['error']);
                        }else{
                            
                            $userid = $this->qwick_register($email);
                            if ($userid===false){
                                $errors['error_by_register'] = str_replace("[+error+]","Ошибка при автоматической регистрации, обратитесь к администратору сайта.",$this->aTemplates['error']);
                            }else{
                                //делаем авто вход
                               if (!$this->auto_login($userid)){
                                    $errors['error_by_register'] = str_replace("[+error+]","Ошибка при автоматическом входе, обратитесь к администратору сайта.",$this->aTemplates['error']);
                               }else{
                                   $all_ok = true;
                               }
                            }
                        }
                    }
                    

                }

                if ($post->by_login){
                    $userid = $this->check_login($post->login,$post->password);

                    if ($userid===false){
                        $errors['error_by_login'] = str_replace("[+error+]","Ошибка имени пользователя или пароля.",$this->aTemplates['error']);
                    }else{
                       //делаем авто вход
                       if (!$this->auto_login($userid)){
                            $errors['error_by_login'] = str_replace("[+error+]","Ошибка при автоматическом входе, обратитесь к администратору сайта.",$this->aTemplates['error']);
                       }else{
                           $all_ok = true;
                       }
                    }
                }

                if ($post->by_skip_register){
                    $all_ok = true;
                }

                foreach($post as $key=>$value){
                    $output = str_replace("[+$key+]", htmlspecialchars($value,ENT_QUOTES,"UTF-8"), $output);
                }
                foreach($errors as $key=>$value){
                    $output = str_replace("[+$key+]", $value, $output);
                }

            }

            if ($all_ok==true){
                $sRedirect = $modx->sbshop->sBaseUrl . 'checkout/register' . $modx->sbshop->config['url_suffix'];
                $modx->sendRedirect($sRedirect);
            }

            echo $output;

        }

        function qwick_register($email){
            global $modx;

            $username = $email;
            $password = $this->generate_password();
            $fullname = "";


            $sql = "insert into ".$modx->getFullTableName("web_users")." (username, password) values ('$username', md5('$password'))";
            if(!$modx->db->query($sql)){
                return false;;
            }

            $userid=$modx->db->getInsertId();

            // save user attributes
            $sql = "INSERT INTO ".$modx->getFullTableName("web_user_attributes")." (internalKey, fullname, email, zip, state, country)
                    VALUES($userid, '$fullname', '$email', '', '', '');";
            if(!$modx->db->query($sql)){
                return false;
            }

            // invoke OnWebSaveUser event
            $modx->invokeEvent("OnWebSaveUser",
                array(
                    "mode"         => "new",
                    "userid"       => $userid,
                    "username"     => $username,
                    "userpassword" => $password,
                    "useremail"    => $email,
                    "userfullname" => $fullname
                ));

            // send email notification
            if (!$this->send_new_password($email,$username,$password,$fullname)) {
                return false;
            }

            return $userid;
        }

        function generate_password($length = 8) {
            $allowable_characters = "abcdefghjkmnpqrstuvxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";
            $ps_len = strlen($allowable_characters);
            mt_srand((double)microtime()*1000000);
            $pass = "";
            for($i = 0; $i < $length; $i++) {
                $pass .= $allowable_characters[mt_rand(0,$ps_len-1)];
            }
            return $pass;
        }

        function send_new_password($email,$uid,$pwd,$ufn){
            global $modx, $site_url;
            require_once MODX_BASE_PATH.'manager/includes/controls/class.phpmailer.php';

            $mailto = $modx->config['mailto'];
            $websignupemail_message = $modx->config['websignupemail_message'];
            $emailsubject = $modx->config['emailsubject'];
            $emailsender = $modx->config['emailsender'];
            $site_name = $modx->config['site_name'];
            $site_start = $modx->config['site_start'];
            $message = sprintf($websignupemail_message, $uid, $pwd); // use old method
            // replace placeholders
            $message = str_replace("[+uid+]",$uid,$message);
            $message = str_replace("[+pwd+]",$pwd,$message);
            $message = str_replace("[+ufn+]",$ufn,$message);
            $message = str_replace("[+sname+]",$site_name,$message);
            $message = str_replace("[+semail+]",$emailsender,$message);
            $message = str_replace("[+surl+]",$site_url,$message);

            // составление письма об успешной регистрации
            $Register = new PHPMailer();
            $Register->CharSet = $modx->config['modx_charset'];
            $Register->From = $emailsender;
            $Register->FromName = $site_name;
            $Register->Subject = $emailsubject;
            $Register->Body = $message;
            $Register->AddAddress($email);

            return $Register->Send();
        }

        function auto_login($userid){
            global $modx;

            $sql = "select * from ".$modx->getFullTableName("web_users")." wu, ".$modx->getFullTableName("web_user_attributes")."wua WHERE BINARY wu.id=$userid and wua.internalKey=wu.id";
            $ds = $modx->db->query($sql);
            $limit = $modx->db->getRecordCount($ds);

            if($limit==0 || $limit>1) {
                return false;
            }

            $row = $modx->db->getRow($ds);

            $internalKey             = $row['internalKey'];
            $dbasePassword             = $row['password'];
            $failedlogins             = $row['failedlogincount'];
            $blocked                 = $row['blocked'];
            $blockeduntildate        = $row['blockeduntil'];
            $blockedafterdate        = $row['blockedafter'];
            $registeredsessionid    = $row['sessionid'];
            $role                    = $row['role'];
            $lastlogin                = $row['lastlogin'];
            $nrlogins                = $row['logincount'];
            $fullname                = $row['fullname'];
            //$sessionRegistered         = checkSession();
            $email                     = $row['email'];

            // load user settings
            if($internalKey){
                $result = $modx->db->query("SELECT setting_name, setting_value FROM ".$modx->getFullTableName("web_user_settings")." WHERE webuser='$internalKey'");
                while ($row = $modx->fetchRow($result, 'both')) $modx->config[$row[0]] = $row[1];
            }

            $currentsessionid = session_id();

            if(!isset($_SESSION['webValidated'])) {
                $sql = "update ".$modx->getFullTableName("web_user_attributes")." SET failedlogincount=0, logincount=logincount+1, lastlogin=thislogin, thislogin=".time().", sessionid='$currentsessionid' where internalKey=$internalKey";
                $ds = $modx->db->query($sql);
            }

            $_SESSION['webShortname']=$username;
            $_SESSION['webFullname']=$fullname;
            $_SESSION['webEmail']=$email;
            $_SESSION['webValidated']=1;
            $_SESSION['webInternalKey']=$internalKey;
            $_SESSION['webValid']=base64_encode($givenPassword);
            $_SESSION['webUser']=base64_encode($username);
            $_SESSION['webFailedlogins']=$failedlogins;
            $_SESSION['webLastlogin']=$lastlogin;
            $_SESSION['webnrlogins']=$nrlogins;
            $_SESSION['webUserGroupNames'] = ''; // reset user group names

            $_SESSION['modx.web.session.cookie.lifetime']= 0;

            // invoke OnWebLogin event
            $modx->invokeEvent("OnWebLogin",
                array(
                    "userid"        => $internalKey,
                    "username"        => $username,
                    "userpassword"    => $givenPassword,
                    "rememberme"    => 0
                ));
            return true;
        }

        //Простая проверка по логину не учитывает блокировок пользователя
        function check_login($username,$password){
            global $modx;

            $username = $modx->db->escape(trim($username));
            $password = trim($password);

            if (empty($username) || empty($password)){
                return false;
            }

            $password = md5($password);
            $sql = "select id from ".$modx->getFullTableName("web_users")." WHERE BINARY username='$username' and password = '$password'";
            $rs = $modx->db->query($sql);
            $row = $modx->db->GetRow($rs);
            if (empty($row)) return false;

            return $row['id'];
       }

}
?>

